Hola a todos, como estan?
Estoy trabajando en mi proyecto de tesis y lo unico que me falta para terminarla es poner a funcionar los RF. (lo cual llevo tratando de hacer hace tiempo)
Esta parte es importante en mi proyecto y he aprendido bastante (aunque siempre se aprende algo nuevo)...Tuve que aprender como funcionaba el SPI, ya que vi que habia muchas personas que hacian la comunicacion entre el pic y el rf por ahi, y existia una libreria en mcc18 (lo estoy haciendo en c) que ya tenia todo asi que era mas rapido. (reusabilidad)
Mi programa de comunicacion funciona perfecto con el SPI entre dos pic(master/slave)....y he estado tratando de hacer la comunicacion entre el rf y pic asi, pero nada...hice mi codigo para un receptor y un transmisor y el rf receptor no recibe nada, DR1 nunca se pone en uno.
He estado pensando en cual podia ser la causa....y esta puede ser que el rf no se esta configurando bien. (por tiempo o por como envio la palabra de configuracion o porque el spi tenga algun problema..)
Aqui les coloco el codigo a ver si pueden detectar algun error...
Esta es la libreria spi que hice para enviar y recibir datos por SPI. (usando funciones de spi.h mcc18)
#include <p18F4620.h>
#include <spi.h>
void config_SPI(void){
OpenSPI( SPI_FOSC_16,
MODE_00,
SMPEND);
}
void config_SPI1(void){
OpenSPI( SLV_SSOFF,
MODE_00,
SMPEND);
}
void trasmitiendo_datos(unsigned char data[],int tamano){
signed char i;
for(i=0;i<tamano;i++){
while(putcSPI(data[i])<0){
SSPCON1bits.WCOL = 0;
data[i] = getcSPI();
;
}
}
}
signed char recibiendo_datos(unsigned char data[],int tamano){
getsSPI(data,tamano);
return(-1);
}
Este es el codigo del transmisor
#include <p18F4620.h>
#include <delays.h>
#include <spi.h>
#include <sicc.h> //creada por mi para la declaracion de las funciones de mi proyecto
//definicion de los pines del RF
#define TX_CE PORTBbits.RB7
#define TX_CS PORTBbits.RB6
#define CONFIG_READY PORTBbits.RB0
//definicion para configuracion del RF
#define PAYLOAD_SIZE 232
#define ADDR1 11
#define ADDR_CRC_SIZE 0b00100011
#define CH_SHOCK_250_FP 0b01001111
#define RF_CH2_RXEN 0b00010100 //2410MHz
unsigned char data_TX[7] = "HELLO!";
void config_rf_tx(void){
unsigned char config_wd[14];
//valores a la configuration word en ShockBurst
config_wd[0]= PAYLOAD_SIZE; //payload 29Bytes * 8 = 232bits de data
config_wd[1]= 0;
config_wd[2]= 0;
config_wd[3]= 0;
config_wd[4]= 0;
config_wd[5]= 0;
config_wd[6]= 0;
config_wd[7]= 0;
config_wd[8]= 0;
config_wd[9]= 0;
config_wd[10]= ADDR1; // direccion
config_wd[11]= ADDR_CRC_SIZE; // 8 bits direccion & 16 bits CRC habilitado
config_wd[12]= CH_SHOCK_250_FP; // 1 canal de recepcion & ShockBurst & 250kbps & full power
config_wd[13]= RF_CH2_RXEN; // RF_CH canal 2 RXEN de transmision
Delay1KTCYx(15); // (tpd2stby) 5msec
TX_CE = 0; TX_CS = 1; CONFIG_READY = 0;
Delay10TCYx(40); // (tcs2data) 10usec
trasmitiendo_datos(config_wd,14);
Delay100TCYx(100);
TX_CE = 0; TX_CS = 0; CONFIG_READY = 1;
Delay10TCYx(40);
}
void Transmision(unsigned char data[],unsigned char rf_address)
{
TX_CE = 1;
Delay10TCYx(40); // (tce2data) 10usec
trasmitiendo_datos(rf_address,1);
trasmitiendo_datos(data,7);
TX_CE = 0; //Inicio de la transmision
}
void inicio_TX(void)
{
config_rf_tx();
}
void main(void){
unsigned char rf_address = 10;
TRISAbits.TRISA6 = 0;
TRISAbits.TRISA7 = 0;
ADCON1 = 0b00001111;
TX_CS = 0;
TX_CE = 0;
CONFIG_READY = 0;
//configuro pines como salida CE y CS
TRISBbits.TRISB7 = 0;
TRISBbits.TRISB6 = 0;
//configuro el pin RB0 como salida
//ente indica que la configuracion ha sido realizada
TRISBbits.TRISB0 = 0;
config_SPI();
inicio_TX();
while(1){
Transmision(data_TX,rf_address);
Delay1KTCYx(30);
}
}
y por ultimo el codigo del receptor
#include <p18F4620.h>
#include <xlcd.h>
#include <delays.h>
#include <spi.h>
#include <sicc.h>
//definicion de los pines del RF
#define RX_CE PORTBbits.RB7
#define RX_CS PORTBbits.RB6
#define RX_DR1 PORTBbits.RB4
//definicion para configuracion del RF
#define PAYLOAD_SIZE 232
#define ADDR1 10
#define ADDR_CRC_SIZE 0b00100011
#define CH_SHOCK_250_FP 0b01001111
#define RF_CH2_RXEN 0b00010101 //2410MHz
unsigned char data_RX[7];
void config_rf_rx(void){
unsigned char buffer[17]="INICIANDO CONFIG";
unsigned char buffer1[17]="FIN CONFIG......";
unsigned char config_wd[14];
//valores a la configuration word en ShockBurst
config_wd[0]= PAYLOAD_SIZE; //payload 29Bytes * 8 = 232bits de data
config_wd[1]= 0;
config_wd[2]= 0;
config_wd[3]= 0;
config_wd[4]= 0;
config_wd[5]= 0;
config_wd[6]= 0;
config_wd[7]= 0;
config_wd[8]= 0;
config_wd[9]= 0;
config_wd[10]= ADDR1; // direccion
config_wd[11]= ADDR_CRC_SIZE; // 8 bits direccion & 16 bits CRC habilitado
config_wd[12]= CH_SHOCK_250_FP; // 1 canal de recepcion & ShockBurst & 250kbps & full power
config_wd[13]= RF_CH2_RXEN; // RF_CH canal 2 RXEN de transmision
Delay1KTCYx(15);
RX_CE = 0; RX_CS = 1;
Delay10TCYx(40); // (tcs2data) 10usec
trasmitiendo_datos(config_wd,14);
Delay100TCYx(100);
RX_CE = 1; RX_CS = 0; //empiezo a monitoriar el aire
Delay10TCYx(40);
}
void Recepcion(int tamano)
{
RX_CE = 0;
data_RX[0]='\0';
if(recibiendo_datos(data_RX,tamano)<0);
RX_CE = 1; //Inicio de nuevo monitoreo del aire
}
void inicio_RX(void)
{
unsigned char buffer[17]="RF_RX INICIADO.";
config_SPI();
config_rf_rx();
}
void main(void){
TRISAbits.TRISA6 = 0;
TRISAbits.TRISA7 = 0;
ADCON1 = 0b00001111;
//configuro pines como entrada DR1 y salida CE y CS
TRISBbits.TRISB7 = 0;
TRISBbits.TRISB6 = 0;
TRISBbits.TRISB4 = 1;
OpenXLCD(FOUR_BIT & LINES_5X7);
inicio_RX();
while(1){
if(RX_DR1==1){
Recepcion(6);
while(BusyXLCD());
SetDDRamAddr(0x00);
putsXLCD(data_RX);
}
}
}
Se que el post esta bastante largo, disculpen
pero pienso que es la unica manera de que entiendan que estoy haciendo...
Si estoy cometiendo alguna burrada en alguna parte del codigo por favor diganme, escucho cualquier sugerencia.
Muchas gracias de antemano.